package com.rgc.dao;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;













import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.PreparedStatementCreator;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.jdbc.support.GeneratedKeyHolder;
import org.springframework.jdbc.support.KeyHolder;

import com.rgc.domain.Permiso;
import com.rgc.domain.Usuario;

import org.jasypt.util.password.StrongPasswordEncryptor;

public class UsuarioDaoImpl extends JdbcDaoSupport implements UsuarioDao {

	
	@Autowired
	public Usuario AddUsuario(final Usuario usuario) {	
		StrongPasswordEncryptor encryptor2 = new StrongPasswordEncryptor();
		final String password2 = encryptor2.encryptPassword(usuario.getClave());
		try {
			KeyHolder keyHolder = new GeneratedKeyHolder(); 
			final String sql = "INSERT INTO usuario(username,clave,mail,nombre,direccion,telefono) values(?,?,?,?,?,?)";
			getJdbcTemplate().update(
					new PreparedStatementCreator()
			        {
			            public PreparedStatement createPreparedStatement(Connection conn) throws SQLException
			            {
			            	
			                PreparedStatement preparedStatement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			                preparedStatement.setString(1,usuario.getUsername());
			                preparedStatement.setString(2, password2);
			                preparedStatement.setString(3, usuario.getMail());
			                preparedStatement.setString(4, usuario.getNombre());
			                preparedStatement.setString(5, usuario.getDireccion());
			                preparedStatement.setString(6, usuario.getTelefono());
			                return preparedStatement;
			            }
			        }	
					,keyHolder);			
			    int idusuario = keyHolder.getKey().intValue();
                String sql_ = "INSERT INTO permiso(idusuario) values(?)";
                getJdbcTemplate().update(sql_, new Object[] {idusuario});
                
                Usuario newUsuario=findUsuario(idusuario);
                
                
                return newUsuario;
         
        } catch (Exception e) {
                System.out.println(e.getMessage());
                e.printStackTrace();
        }
		return null;
	}
	
	

	public boolean DelUsuario(Usuario usuario) {
		return false;
	}


	
	public List<Usuario> ListUsuario() {
		
		try {
			String sql = " select * from ( "
						+" select a.*,b.nombre as equipo "
						+" from usuario a,equipo b,equipo_usuario c "
						+" where a.idusuario=c.idusuario and c.idequipo=b.idequipo "
						+" union  "
						+" select *,'' as equipo from usuario "
						+" ) as tabla "
						+"  group by username order by idusuario ";
			List<Usuario> usuarioFound =  getJdbcTemplate().query(
        			sql, new BeanPropertyRowMapper<Usuario>(Usuario.class));
        	return usuarioFound;
        	
    } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
    }
	return new ArrayList<Usuario>();
	}

	public List<Usuario> ListUsuario(int indexInicio, int indexTermino) {
		// TODO Auto-generated method stub
		return null;
	}

	
	public List<Usuario> ListUsuario(String[] campo, String[] valor) {
		try {
			String sql = " SELECT * FROM usuario  ";
			String conector=" where ";
			for (int i=0;i<campo.length;i++)  {
				 sql+=conector+""+campo[i]+"='"+valor[i]+"'";
				 conector=" and ";
						 
		    }
			sql+=conector+"  estado=1 "+" order by idusuario";
			System.out.println("CONSULTAUSUARIO:"+sql);
			List<Usuario> usuarioFound =  getJdbcTemplate().query(
        			sql, new BeanPropertyRowMapper<Usuario>(Usuario.class));
         
			

        	return usuarioFound;
        	
    } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
    }
	return new ArrayList<Usuario>();
	}

	public Usuario findUsuario(int idusuario) {	
		List<Usuario> usuario=ListUsuario(new String[]{"idusuario"}, new String[]{idusuario+""});
		if(usuario.size()>0)
			return usuario.get(0);
		return new Usuario();
	}


	public boolean checkUsername(Usuario usuario) {
		List<Usuario> listaUsername=ListUsuario(new String[]{"username"}, new String[]{usuario.getUsername()});
		if(listaUsername.size()==0  )
			return false;
		return true;
	
	}


	public boolean checkMail(Usuario usuario) {

		List<Usuario> listaMail=ListUsuario(new String[]{"mail"}, new String[]{usuario.getMail()});
		
		if(listaMail.size()==0 )
			return false;
		return true;
	}


	@Autowired
	public Usuario checkLogin(Usuario usuario) {
		List<Usuario> listaUsuario=ListUsuario(new String[]{"username"}, new String[]{usuario.getUsername()});
		if(listaUsuario.size()>0){
			StrongPasswordEncryptor encryptor2 = new StrongPasswordEncryptor();
			if(!encryptor2.checkPassword(usuario.getClave(),listaUsuario.get(0).getClave() ))
				return null;
			int idusuario=Integer.parseInt(listaUsuario.get(0).getIdusuario());
			List<Permiso> listaPermiso=ListPermiso(idusuario);	
			if(listaPermiso.size()>0){	
				
				List<Permiso> permiso=new ArrayList<Permiso>();
			
				int i=0;
				for (Permiso permisoData : listaPermiso){	
				
					permiso.add(permisoData);
					
					i++;			
				}
				listaUsuario.get(0).setPermiso(permiso);
				return listaUsuario.get(0);
			}
		}
		return null;
	}


	@Autowired
	public List<Permiso> ListPermiso(int idusuario) {
		
		try { 
	            String sql = "SELECT a.*,b.nombre as tipo_usuario_nombre FROM permiso a,tipo_usuario b where idusuario='"+idusuario+"' and a.idtipo_usuario=b.idtipo_usuario  ";
				List<Permiso> permisoFound =  getJdbcTemplate().query(
	        			sql, new BeanPropertyRowMapper<Permiso>(Permiso.class));
	         
	
	        	return permisoFound;
	        	
	    } catch (Exception e) {
	            System.out.println(e.getMessage());
	            e.printStackTrace();
	    }
		return new ArrayList<Permiso>();
	}
	
	@Autowired
	public List<Permiso> ListPermiso() {
		
		try { 
	            String sql = "SELECT a.*,b.nombre as tipo_usuario_nombre FROM permiso a,tipo_usuario b where  a.idtipo_usuario=b.idtipo_usuario  ";
				List<Permiso> permisoFound =  getJdbcTemplate().query(
	        			sql, new BeanPropertyRowMapper<Permiso>(Permiso.class));
	         
	
	        	return permisoFound;
	        	
	    } catch (Exception e) {
	            System.out.println(e.getMessage());
	            e.printStackTrace();
	    }
		return new ArrayList<Permiso>();
	}



	
	public Usuario findUsuario(String idusuario) {
		try{
			
			return findUsuario(Integer.parseInt(idusuario));
			
			 
			
		}catch(Exception e){
			return null;
		}
	
	}
	
	public List<Permiso> ListPermiso(String idusuario) {
		try{
			
			return ListPermiso(Integer.parseInt(idusuario));
			
			 
			
		}catch(Exception e){
			return null;
		}
	
	}



	public boolean addPermiso(Permiso permiso) {
		
		try{
			String sql = "SELECT * from permiso   where idusuario='"+permiso.getIdusuario()+"' "
										+ "and idtipo_usuario="+permiso.getIdtipo_usuario()+"  ";
			List<Permiso> permisoFound =  getJdbcTemplate().query(
        			sql, new BeanPropertyRowMapper<Permiso>(Permiso.class));
			
			System.out.println("PERMISO :"+sql);
			
			if(permisoFound.size()>0){
				sql="DELETE FROM permiso where idusuario='"+permiso.getIdusuario()+"' "
										+ "and idtipo_usuario="+permiso.getIdtipo_usuario()+"  ";
				getJdbcTemplate().update(sql);
			}
		
			System.out.println("PERMISO :"+sql);
			sql="INSERT INTO permiso(idusuario,idtipo_usuario,idagrupacion,nivel) values(?,?,?,?) ";	
			getJdbcTemplate().update(sql,new Object[]{permiso.getIdusuario(),permiso.getIdtipo_usuario(),permiso.getIdagrupacion(),permiso.getNivel()});
		
			System.out.println("PERMISO :"+sql);
				
			
			
			return true;
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}

	}



	public boolean delPermiso(Permiso permiso) {
		try{
			
			String sql="DELETE FROM permiso where idusuario='"+permiso.getIdusuario()+"' "
									+ "and idtipo_usuario="+permiso.getIdtipo_usuario()+"  ";
			getJdbcTemplate().update(sql);
			
			
			System.out.println("DELPERMISO :"+sql);
			return true;
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}

	}



	public List<Usuario> getStaff(String idgrupo) {
		String sql = "SELECT a.* from usuario a, permiso b   where idagrupacion='"+idgrupo+"' and a.estado=1 and b.idtipo_usuario='4' and a.idusuario=b.idusuario ";
		System.out.println(sql);
		List<Usuario> listado =  getJdbcTemplate().query(sql, new BeanPropertyRowMapper<Usuario>(Usuario.class));
		if(listado.size()>0)
			return listado;
		return new ArrayList<Usuario>();
	}



	
	
	
	public Usuario getUsuario(String username) {
		List<Usuario> usuario=ListUsuario(new String[]{"username"},new String[]{username});
		if(usuario.size()>0)
			return usuario.get(0);
		return null;
	}



	public String findStaff(String idusuario) {
		try { 
            String sql = "SELECT * FROM permiso where idusuario='"+idusuario+"' and idtipo_usuario='4' and nivel='2'  ";
			List<Permiso> permisoFound =  getJdbcTemplate().query(
        			sql, new BeanPropertyRowMapper<Permiso>(Permiso.class));
         
			if(permisoFound.size()>0)
				return permisoFound.get(0).getIdagrupacion();
        	
    } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
    }

	return null;
	}



	public boolean udpUsuario(Usuario usuario) {
		try{
			StrongPasswordEncryptor encryptor2 = new StrongPasswordEncryptor();
			String clave="";
			if(!usuario.getClave().equals("SiNcLaVe"));
				clave=",clave='"+ encryptor2.encryptPassword(usuario.getClave())+"' ";
				
			String sql="UPDATE  usuario set username='"+usuario.getUsername()+"',mail='"+usuario.getMail()+"',nombre='"+usuario.getNombre()+"',direccion='"+usuario.getDireccion()+"',telefono='"+usuario.getDireccion()+"',urlimagen='"+usuario.getUrlimagen()+"',info="+usuario.isInfo()+",infoplayer="+usuario.isInfoplayer()+",infoeventos="+usuario.isInfoeventos()+" where idusuario='"+usuario.getIdusuario()+"'  ";
			getJdbcTemplate().update(sql);
			return true;
			
		}catch(Exception e){
			
			e.printStackTrace();
			
		}
		return false;
		
	}


	


	
    
    
}
